﻿using System;
using System.Diagnostics;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

namespace ExampleIncrementalGenerator
{
    [Generator(LanguageNames.CSharp)]
    public class A_获取类型完全限定名 : IIncrementalGenerator
    {
        public void Initialize(IncrementalGeneratorInitializationContext context)
        {
            var incrementailValuesProvider = context.SyntaxProvider.CreateSyntaxProvider(
                predicate: (syntaxNode, _) =>
                {
                    // 在此进行快速的语法判断逻辑，可以判断当前的内容是否感兴趣，如此过滤掉一些内容，从而减少后续处理，提升性能

                    // 这里样式的是获取到 Program 类的完全限定名，也就是只需要用到 Class 类型
                    return syntaxNode.IsKind(SyntaxKind.ClassDeclaration);
                },
                transform: (generatorSyntaxContext, _) =>
                {
                    var symbolInfo = generatorSyntaxContext.SemanticModel.GetDeclaredSymbol(generatorSyntaxContext.Node);

                    // 带上 global 格式的输出 FullName 内容
                    var symbolDisplayFormat = new SymbolDisplayFormat
                    (
                        // 带上命名空间和类型名
                        SymbolDisplayGlobalNamespaceStyle.Included
                        // 命名空间之前加上 global 防止冲突
                        //SymbolDisplayTypeQualificationStyle
                        //    .NameAndContainingTypesAndNamespaces
                    );

                    var displayString = symbolInfo.ToDisplayString(symbolDisplayFormat);

                    return generatorSyntaxContext;
                });


            context.RegisterSourceOutput(incrementailValuesProvider, (sourceProductionContext, generatorSyntaxContext) =>
            {
                // 加上这里只是为了让 incrementalValuesProvider 能够执行
            });
        }
    }
}
